# Глобальная очередь событий. #

Вкратце - это большая таблица внутри игры, где написано что и когда должно завершится у игроков.

Программный модуль находится в файле `game/queue.php`

Временной поток игры состоит из отрезков времени, между двумя событиями, которые влияют на состояние аккаунтов игроков.<br>
События всех игроков выстраиваются в общую очередь. Очередь дискретна - каждое событие синхронизировано посекундно.<br>
Проверка на завершение события (движение очереди) осуществляется когда игроки совершаются какие-либо действия (переходят по страницам).<br>
Если два события попадают на одну секунду, то они обрабатываются в порядке приоритета (например если Атака совпадает по времени с Переработать,<br>
на тех же координатах, то вначале обрабатывается Атака, а потом Переработать).<br>
<br>
Каждое событие имеет начало (время запуска) и конец (время завершения события). Некоторые события можно отменить. Отмена некоторых событий порождает<br>
другие события (например отмена задания флота порождает новое задание возврата флота).<br>
<br>
Главные типы событий аккаунта:<br>
<ul><li>Счётчики времени на аккаунте игрока (действие офицеров, удаление аккаунта итп.)<br>
</li><li>Строительство на планете/луне<br>
</li><li>Исследование<br>
</li><li>Строительство на верфи<br>
</li><li>Задания для флота и МПР<br>
</li><li>Глобальные события для всех игроков (релогин, чистка виртуального лома, удаление уничтоженных планет, пересчёт очков 3 раза в сутки итп.)</li></ul>

Пересчёт очков: 8:05, 16:05, 20:05 по серверу<br>
<br>
Как происходит обновление очереди:<br>
После очередного клика одного из юзеров проверяется каждое задание очереди на завершение. Если задание завершено - вызывается его обработчик и задание<br>
удаляется из очереди.<br>
<br>
<h1>Таблица событий</h1>

Таблица <code>queue</code> представляет собой глобальную очередь событий. Формат таблицы:<br>
<br>
<table><thead><th> <b>столбец</b> </th><th> <b>SQL тип</b> </th><th> <b>описание</b> </th></thead><tbody>
<tr><td> task_id </td><td> INT PRIMARY KEY </td><td> уникальный номер задания </td></tr>
<tr><td> owner_id </td><td> INT </td><td> номер пользователя которому принадлежит задание </td></tr>
<tr><td> type </td><td> CHAR(20) </td><td> тип задания, каждый тип имеет свой обработчик </td></tr>
<tr><td> sub_id </td><td> INT </td><td> дополнительный номер, разный у каждого типа задания, например для постройки - ID планеты, для задания флота - ID флота</td></tr>
<tr><td> obj_id</td><td> INT</td><td> дополнительный номер, разный у каждого типа задания, например для постройки - ID здания</td></tr>
<tr><td> level</td><td> INT</td><td> уровень постройки / количество заказанных единиц на верфи </td></tr>
<tr><td> start </td><td> INT UNSIGNED </td><td> время начала задания time()</td></tr>
<tr><td> end </td><td> INT UNSIGNED </td><td> время окончания задания time()</td></tr>
<tr><td> prio </td><td> INT </td><td> приоритет события, используется для событий, которые заканчиваются в одно и тоже время, чем выше приоритет, тем раньше выполнится событие</td></tr></tbody></table>

<h1>Типы событий</h1>

<table><thead><th> <b>тип</b> </th><th> <b>sub_id</b> </th><th> <b>obj_id</b> </th><th> <b>описание</b> </th></thead><tbody>
<tr><td><code>CommanderOff</code></td><td>  </td><td>  </td><td>заканчивается офицер: Командир</td></tr>
<tr><td><code>AdmiralOff</code></td><td>  </td><td>  </td><td>заканчивается офицер: Адмирал</td></tr>
<tr><td><code>EngineerOff</code></td><td>  </td><td>  </td><td>заканчивается офицер: Инженер</td></tr>
<tr><td><code>GeologeOff</code></td><td>  </td><td>  </td><td>заканчивается офицер: Геолог</td></tr>
<tr><td><code>TechnocrateOff</code></td><td>  </td><td>  </td><td>заканчивается офицер: Технократ</td></tr>
<tr><td><code>DeleteAccount</code></td><td>  </td><td>  </td><td>удалить аккаунт</td></tr>
<tr><td><code>UnbanPlayer</code></td><td>  </td><td>  </td><td>разбанить игрока</td></tr>
<tr><td><code>ChangeEmail</code></td><td>  </td><td>  </td><td>записать постоянный почтовый адрес</td></tr>
<tr><td><code>AllowName</code></td><td>  </td><td>  </td><td>разрешить смену имени игрока</td></tr>
<tr><td><code>AllowAttacks</code></td><td>  </td><td>  </td><td>отменить запрет атак у игрока</td></tr>
<tr><td><code>UnloadAll</code></td><td>  </td><td>  </td><td>сделать релогин всех игроков</td></tr>
<tr><td><code>CleanDebris</code></td><td>  </td><td>  </td><td>чистка виртуальных полей обломков</td></tr>
<tr><td><code>CleanPlanets</code></td><td>  </td><td>  </td><td>удаление уничтоженных планет / покинутых лун</td></tr>
<tr><td><code>UpdateStats</code></td><td>  </td><td>  </td><td>пересчёт статистики игроков</td></tr>
<tr><td><code>Build</code></td><td>номер записи в очереди построек</td><td>тип постройки</td><td>постройка на планете</td></tr>
<tr><td><code>Demolish</code></td><td>номер записи в очереди построек</td><td>тип постройки</td><td>снос на планете</td></tr>
<tr><td><code>Research</code></td><td>номер планеты где было запущено исследование</td><td>тип исследования</td><td>исследование</td></tr>
<tr><td><code>Shipyard</code></td><td>номер планеты</td><td>тип постройки</td><td>задание для верфи</td></tr>
<tr><td><code>Fleet</code></td><td>номер записи в таблице флотов</td><td>  </td><td>Задание флота / Атака МПР</td></tr>